using System;
using System.Collections.Generic;
using UD.GRAL.Entity;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;

namespace UD.GRAL.DataAccess
{
    public class PaisDAL : GeneralDAL
    {
        public PaisDAL()
        {
        }
        public int InsertarPais(Pais pPais)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Pais_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdPais", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@CodPais", DbType.String, pPais.CodPais);
                    vDataBase.AddInParameter(vDbCommand, "@NombrePais", DbType.String, pPais.NombrePais);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pPais.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pPais.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pPais.IdPais = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdPais").ToString());
                    GenerarLogAuditoria(pPais, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarPais(Pais pPais)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Pais_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdPais", DbType.Int32, pPais.IdPais);
                    vDataBase.AddInParameter(vDbCommand, "@CodPais", DbType.String, pPais.CodPais);
                    vDataBase.AddInParameter(vDbCommand, "@NombrePais", DbType.String, pPais.NombrePais);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pPais.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pPais.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pPais, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarPais(Pais pPais)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Pais_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdPais", DbType.Int32, pPais.IdPais);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pPais, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public Pais ConsultarPais(int pIdPais)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Pais_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdPais", DbType.Int32, pIdPais);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        Pais vPais = new Pais();
                        while (vDataReaderResults.Read())
                        {
                            vPais.IdPais = vDataReaderResults["IdPais"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdPais"].ToString()) : vPais.IdPais;
                            vPais.CodPais = vDataReaderResults["CodPais"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodPais"].ToString()) : vPais.CodPais;
                            vPais.NombrePais = vDataReaderResults["NombrePais"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombrePais"].ToString()) : vPais.NombrePais;
                            vPais.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vPais.Estado;
                            vPais.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vPais.UsuarioCrea;
                            vPais.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vPais.FechaCrea;
                            vPais.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vPais.UsuarioModifica;
                            vPais.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vPais.FechaModifica;
                        }
                        return vPais;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<Pais> ConsultarPaiss(String pCodPais, String pNombrePais, Boolean? pEstado)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Paiss_Consultar"))
                {
                    if(pCodPais != null)
                         vDataBase.AddInParameter(vDbCommand, "@CodPais", DbType.String, pCodPais);
                    if(pNombrePais != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombrePais", DbType.String, pNombrePais);
                    if(pEstado != null)
                         vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pEstado);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<Pais> vListaPais = new List<Pais>();
                        while (vDataReaderResults.Read())
                        {
                                Pais vPais = new Pais();
                            vPais.IdPais = vDataReaderResults["IdPais"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdPais"].ToString()) : vPais.IdPais;
                            vPais.CodPais = vDataReaderResults["CodPais"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodPais"].ToString()) : vPais.CodPais;
                            vPais.NombrePais = vDataReaderResults["NombrePais"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombrePais"].ToString()) : vPais.NombrePais;
                            vPais.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vPais.Estado;
                            vPais.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vPais.UsuarioCrea;
                            vPais.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vPais.FechaCrea;
                            vPais.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vPais.UsuarioModifica;
                            vPais.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vPais.FechaModifica;
                                vListaPais.Add(vPais);
                        }
                        return vListaPais;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
